package com.demo.controller.system;

import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.demo.mapper.system.MenuMapper;
import com.demo.pojo.PO.Menu;
import com.demo.dao.Result;
import com.demo.pojo.VO.VOMenu;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

// 菜单管理
@RestController
@RequestMapping("/RMS/Menu")
@CrossOrigin // 跨域
public class MenuController {
    @Autowired
    private MenuMapper menuMapper;
    @GetMapping
    public Result getAllMenu() {
        List<Menu> vodMenuList =menuMapper.selectList(null);
        // 初始化最外层转输出对象
        List<VOMenu> vodMenuVOList = vodMenuList.stream()
                .filter(m->m.getParentId()==0)
                .map(m->{
                    VOMenu VOMenu = new VOMenu();
                    VOMenu.setId(m.getId());
                    VOMenu.setName(m.getName());
                    VOMenu.setType(m.getType());
                    VOMenu.setPath(m.getPath());
                    VOMenu.setComponent(m.getComponent());
                    VOMenu.setPerms(m.getPerms());
                    VOMenu.setIcon(m.getIcon());
                    VOMenu.setSortValue(m.getSortValue());
                    VOMenu.setStatus(m.getStatus());
                    VOMenu.setCreateTime(m.getCreateTime());
                    return VOMenu;
        }).collect(Collectors.toList());
        List<VOMenu> VOMenus = getMenuStream(vodMenuList, vodMenuVOList);

        return Result.success(VOMenus);
    }
    public List<VOMenu> getMenuStream(List<Menu> vodMenuList, List<VOMenu> vodMenuVOList){
        List<VOMenu> VOMenu1 =  vodMenuVOList.stream()
                .map(m->{
            VOMenu VOMenu = new VOMenu();
            VOMenu.setId(m.getId());
            VOMenu.setName(m.getName());
            VOMenu.setType(m.getType());
            VOMenu.setPath(m.getPath());
            VOMenu.setComponent(m.getComponent());
            VOMenu.setPerms(m.getPerms());
            VOMenu.setIcon(m.getIcon());
            VOMenu.setSortValue(m.getSortValue());
            VOMenu.setStatus(m.getStatus());
            VOMenu.setCreateTime(m.getCreateTime());
            return VOMenu;
        })
                .map(m->{
            //拿到每个id再全部拿一次parentId进行对比
            List<VOMenu> VOMenu3 =  vodMenuList.stream().filter(m2->m2.getParentId().equals(m.getId())).map(m2->{
                VOMenu VOMenu2 = new VOMenu();
                VOMenu2.setId(m2.getId());
                VOMenu2.setName(m2.getName());
                VOMenu2.setType(m2.getType());
                VOMenu2.setPath(m2.getPath());
                VOMenu2.setComponent(m2.getComponent());
                VOMenu2.setPerms(m2.getPerms());
                VOMenu2.setIcon(m2.getIcon());
                VOMenu2.setSortValue(m2.getSortValue());
                VOMenu2.setStatus(m2.getStatus());
                VOMenu2.setCreateTime(m2.getCreateTime());
                return VOMenu2;
            }).collect(Collectors.toList());
            m.setParent(VOMenu3);
//            System.out.println(m.getParent().toArray().length);
//            System.out.println(m.getParent());
            if (m.getParent().toArray().length>0){
                m.setParent(getMenuStream(vodMenuList,m.getParent()));
            }
            return m;
        }).collect(Collectors.toList());

        return VOMenu1;
    }
    // 新增菜单表
    @PostMapping(value = "/addMenu")
    public Result addMenu(@RequestBody Menu menu) {
        // 写死新增的是菜单表
        menu.setParentId(0);
        return Result.success(menuMapper.insert(menu));
    }
    // 新增子菜单
    @PostMapping(value = "/addSonMenu")
    public Result addSonMenu(@RequestBody Menu menu) {
        return Result.success(menuMapper.insert(menu));
    }

    // 设置菜单状态码，把新的状态码修改好放对象里传过来，记得带上id
    @PutMapping(value = "/updateMenuStatus")
    public Result updateMenuStatus(@RequestBody Menu menu){
        String MenuStatus = "status = "+String.valueOf(menu.getStatus());
        UpdateWrapper<Menu> queryWrapper = new UpdateWrapper<Menu>()
                .eq("id", menu.getId())
                .setSql(MenuStatus);
        return Result.success(menuMapper.update( null,queryWrapper));
    }

    // 修改菜单信息
    @PutMapping(value = "/updateMenu")
    public Result updateMenu(@RequestBody Menu menu){
        return Result.success(menuMapper.updateById(menu));
    }

    public List<Menu> i = new ArrayList<>();
    public void getAllDelMenu(List<Menu> allMenu,Menu menu){
        List<Menu> menu1 = new ArrayList<Menu>();
        menu1.add(menu);
        menu1.stream().map(m->{
            List<Menu> menu2 = allMenu.stream().filter(m2->{
                return m2.getParentId().equals(m.getId());}
            ).map(m2->{
                i.add(m2);
                getAllDelMenu(allMenu,m2);
                return m2;
            })
                    .collect(Collectors.toList());
            return m;
        } ).collect(Collectors.toList());
    }

    // 删除菜单以及其子菜单
    @DeleteMapping(value = "/delMenu")
    public Result delMenu(@RequestBody Menu menu){
        List<Menu> allMenu = menuMapper.selectList(null);
        i.add(menu);
        getAllDelMenu(allMenu,menu);
        List<Integer> id= i.stream().map(Menu::getId).collect(Collectors.toList());
        return Result.success(menuMapper.deleteBatchIds(id));
    }
}
